\ June 91 Reimplemented ordered-col etc. using multiple inheritance
\ May 92 Added obj-array
\ July 92 Fixed OBJ: ObjHandle to use NPTR: instead of PTR:
\ HandleArray now inherits from Obj_array.
\ Dec 92 Replaced UGET: in Int and Byte with new classes UINT and UBYTE.
:class LONGWORD super{ object } \ Generic superclass for var, handle etc.
4 bytes data
:m CLEAR: inline{ 0 obj !} 0 ^base ! ;m
:m GET: inline{ obj @} ^base @ ;m
:m PUT: inline{ obj !} ^base ! ;m
:m ->: inline{ @ obj !} chksame @ put: self ;m
:m PRINT: ^base @ . ;m
:m CLASSINIT: clear: self ;m
;class
:class VAR super{ longword }
:m +: inline{ obj +!} ^base +! ;m
:m -: inline{ obj -!} ^base -! ;m
;class
:class INT super{ object }
2 bytes data
:m CLEAR: inline{ 0 obj w!} 0 ^base w! ;m
:m GET: inline{ obj w@x} ^base w@x ;m
:m PUT: inline{ obj w!} ^base w! ;m
:m +: inline{ obj w+!} ^base w+! ;m
:m -: inline{ obj w-!} ^base w-! ;m
:m ->: inline{ w@ obj w!}
chksame w@ put: self ;m
:m INT: ^base w@ makeint ;m \ return as toolbox int
:m PRINT: ^base w@ . ;m
:m CLASSINIT: clear: self ;m
;class
:class UINT super{ int }
:m GET: inline{ obj w@} ^base w@ ;m
;class
:class BYTE super{ object }
1 bytes data
:m CLEAR: inline{ 0 obj c!} 0 ^base c! ;m
:m GET: inline{ obj c@x} ^base c@x ;m
:m PUT: inline{ obj c!} ^base c! ;m
:m ->: inline{ c@ obj c!} chksame c@ put: self ;m
:m PRINT: ^base c@ . ;m
:m CLASSINIT: clear: self ;m
;class
:class UBYTE super{ byte }
:m GET: inline{ obj c@} ^base c@ ;m
;class
:class BOOL super{ byte }
:m PUT: inline{ 0<> obj c!} 0<> ^base c! ;m
:m SET: inline{ true obj c!} true ^base c! ;m
:m PRINT: get: self IF ." true" ELSE ." false" THEN ;m
;class
\ Handle class can store handles to relocatable heap blocks. It would be nice to store the length too, but this class is used for handles in toolbox records so we can't. Not here at least.
0 value RELCNT \ For testing - counts release: msgs
\ to make sure we're releasing everything
:class HANDLE super{ longword }
:m PTR: \ Dereferences handle to get pointer. Trap if nil.
inline{ obj @ @} ^base @ @ ;m
:m NPTR: \ Dereferences handle and masks with SAmask so we can
\ use the pointer numerically.
^base @ @ SAmask and ;m
:m RELEASE: \ Deallocates the heap block, if allocated.
1 ++> relCnt killH ;m
:m CLEAR: nilH ^base ! ;m \ We hope we know what we're doing.
:m NIL?: \ ( -- b )
get: self nilH = ;m
:m SETSIZE: \ ( size -- }
setHsz 0= ?error 166 ;m
:m SIZE: \ ( -- size ) Gets current size.
getHSz ;m
:m NEW: \ ( size -- )
newH 0= ?error 166 ;m
:m LOCK: lok ;m
:m UNLOCK: unlok ;m
:m GETSTATE: ( -- state ) HgetSt ;m
:m SETSTATE: ( state -- ) HsetSt ;m
:m LOCKED?: ( -- b ) HgetSt $ 80 and 0<> ;m
:m MOVEHI: MvHHi drop ( errors don't really matter here ) ;m
:m ->: \ ( ^hdl -- ) Copies passed-in handle's heap data to self.
chkSame copyH ?error 167 ;m
:m PRINT:
& $ emit ^base @ u.h ;m \ We assume a print: of a handle is more
\ useful in hex.
:m CLASSINIT: clear: self ;m \ Initially nil
;class
\ OBJHANDLE is a handle that points to an object in the heap.